package cn.acac.yygh.cmn.controller;

import cn.acac.yygh.cmn.service.DictService;
import cn.acac.yygh.model.cmn.Dict;
import cn.acac.yygh.result.R;
import cn.acac.yygh.vo.cmn.DictEeVo;
import com.alibaba.excel.EasyExcel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/admin/cmn")
@Api(value = "数据字典操作")
public class DictController {

    @Autowired
    private DictService dictService;

    /**
     * 导入Excel的文件
     * @param file
     * @return
     */
    @PostMapping("/updateExcel")
    public R updateExcel(MultipartFile file) throws IOException {
        dictService.updateExcel(file);
        return R.ok();
    }

    /**
     * 下载Excel的数据字典信息
     * @param response
     */
    @GetMapping("/download")
    public void downloadExcel(HttpServletResponse response) throws Exception {
        // 查询数据库中的所有dict数据
        List<Dict> dictList = dictService.list();
        // 创建一个新的集合存储下载的dict数据
        List<DictEeVo> dictEeVoList = new ArrayList<>(dictList.size()); // 指定初始化大小
        // 进行循环遍历
        for (Dict dict : dictList) {
            DictEeVo dictEeVo = new DictEeVo();
            // 将dict数据拷贝到dictEeVo中
            BeanUtils.copyProperties(dict,dictEeVo);
            dictEeVoList.add(dictEeVo);
        }
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("字典数据", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 进行写出
        EasyExcel.write(response.getOutputStream(),DictEeVo.class)
                .sheet("字典服务")
                .doWrite(dictEeVoList);
    }

    /**
     * 根据父id查询所有的子节点
     * @param pid
     * @return
     *
     */
    @Cacheable(value = "dict",key = "'selectIndexList'+#pid")  // 指定存储到redis的数据key
    @GetMapping("/findChildData/{pid}")
    @ApiOperation("根据父id查询所有的子节点")
    public R findChildData(@PathVariable("pid")Long pid){
        List<Dict> dictList = dictService.findChildData(pid);
        // 给查询出的子节点在判断是否还有子节点
        for (Dict dict : dictList) {
            dict.setHasChildren(dictService.hasChildren(dict.getId()));
        }
        return R.ok().setData("items",dictList);
    }

    /**
     * 医院服务调用字典服务查询信息
     * @param value
     * @return
     */
    @GetMapping("/{value}")
    public String findNameByValue(@PathVariable("value")String value){
        return dictService.findNameByValue(value);
    }

    /**
     * 医院服务调用字典服务查询信息
     * @param value
     * @return
     */
    @GetMapping("/{dictCode}/{value}")
    public String findNameByValue(@PathVariable("dictCode")String dictCode,@PathVariable("value")String value){
        return dictService.findNameByValue(dictCode,value);
    }
}
